package models

import (
	"database/sql/driver"
	"encoding/json"
	"time"
)

// PermissionsMap 权限映射类型，用于处理JSON格式的权限数据
type PermissionsMap map[string]bool

// Value 实现 driver.Valuer 接口，用于将权限映射转换为JSON存储到数据库
func (p PermissionsMap) Value() (driver.Value, error) {
	if p == nil {
		return nil, nil
	}
	return json.Marshal(p)
}

// Scan 实现 sql.Scanner 接口，用于从数据库读取JSON数据并解析为权限映射
func (p *PermissionsMap) Scan(value interface{}) error {
	if value == nil {
		*p = make(PermissionsMap)
		return nil
	}

	var bytes []byte
	switch v := value.(type) {
	case []byte:
		bytes = v
	case string:
		bytes = []byte(v)
	default:
		*p = make(PermissionsMap)
		return nil
	}

	// 先尝试解析为对象
	var obj map[string]bool
	if err := json.Unmarshal(bytes, &obj); err == nil {
		*p = obj
		return nil
	}

	// 如果不是对象，尝试解析为字符串数组
	var arr []string
	if err := json.Unmarshal(bytes, &arr); err == nil {
		m := make(PermissionsMap)
		for _, k := range arr {
			m[k] = true
		}
		*p = m
		return nil
	}

	// 其它情况，返回空map
	*p = make(PermissionsMap)
	return nil
}

// Role 角色模型
type Role struct {
	ID          int64          `gorm:"column:id;primaryKey;autoIncrement" json:"id"`
	Name        string         `gorm:"column:name;not null" json:"name"`
	Permissions PermissionsMap `json:"permissions" gorm:"type:json"` // 权限列表
	Status      int            `gorm:"column:status;not null;default:1" json:"status"`
	CreatedAt   time.Time      `gorm:"column:created_at;not null;default:CURRENT_TIMESTAMP" json:"created_at"`
	UpdatedAt   time.Time      `gorm:"column:updated_at;not null;default:CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP" json:"updated_at"`
}

// TableName 指定表名
func (Role) TableName() string {
	return "roles"
}
